package kr.pe.johnkim.sendme.util;

import java.util.ArrayList;
import java.util.List;

import kr.pe.johnkim.sendme.provider.SendMeFriend;
import kr.pe.johnkim.sendme.provider.SendMeInstall;
import kr.pe.johnkim.sendme.provider.SendMeMember;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteStatement;
import android.util.Log;

public class SendMeDBManagerInstallUser {
	
	String TAG = "SendMeDBManagerInstallUser";
	
	// DB관련 상수 선언
//    private static final String dbName = "AppInstallUser.db";
    private static final String dbName = "AppInstallUser2.db";
    
//    private static final String tableName = "APinfo";										// 원본(샘플)에서 생성하는 테이블명
   
    private static final String tableNameAppInstallUser = "AppInstallUserTable";					// 임시 저장 파일 정보 테이블 - 사용자 아이디 / 받는 사람(들) 이름(아이디) / 파일 저장될 경로(+파일명) / 날짜
    
    public static final int dbVersion = 1;
 
    // DB관련 객체 선언
    private OpenHelper opener; // DB opener
    private SQLiteDatabase db; // DB controller
 
    // 부가적인 객체들
    private Context context;
 
    // 생성자
    public SendMeDBManagerInstallUser(Context context) {
        this.context = context;
        this.opener = new OpenHelper(context, dbName, null, dbVersion);
        db = opener.getWritableDatabase();
    }
 
    // Opener of DB and Table
    private class OpenHelper extends SQLiteOpenHelper {
 
        public OpenHelper(Context context, String name, CursorFactory factory,
                int version) {
            super(context, name, null, version);
            // TODO Auto-generated constructor stub
        }
 
        // 생성된 DB가 없을 경우에 한번만 호출됨
        @Override
        public void onCreate(SQLiteDatabase arg0) {
            /*
             * 테이블 생성
             */
            String createTempAudioSql = "create table " + tableNameAppInstallUser + " ("
                    + "id_app_install_user integer primary key autoincrement, " 
                    + "phone_number text, "					// 전화번호		
                    + "user_name text, "					// 이름		
            		+ "nick_name text, "				// 닉네임	
            		+ "install_yn text )";				// 설치 여부	
            arg0.execSQL(createTempAudioSql);
        }
 
        @Override
        public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
            // TODO Auto-generated method stub
        }
    }
 
    
    
  /*				
   *  데이터 추가 - 서버로부터 받은 앱 설치 사용자 리스트를 저장한다 (모두 설치한 유저뿐)
   *   (기존 데이터가 있다면 삭제)
   *   
   *   --> 전화번호부 전체 리스트를 저장하되, 설치 여부값을 함께 저장
   *   
   */
    public boolean insertAppInstallUser(List<SendMeFriend> phoneBookFriendList) {
    	
    	boolean isSuccess = true;
    	// 데이터 개수가 적을때(일반적인 경우)
//    	ContentValues values = new ContentValues();
//    	try{
//    		// 기존 데이터는 모두 삭제.
//        	String sql = "delete from " + tableNameAppInstallUser + ";";
//            db.execSQL(sql);
//         
//    		for(int i=0; i<phoneBookFriendList.size(); i++){
//        		values.put("phone_number",phoneBookFriendList.get(i).getPhoneNumber());
//        		values.put("user_name",phoneBookFriendList.get(i).getName());
//        		values.put("nick_name",phoneBookFriendList.get(i).getNickName());
//        		values.put("install_yn",phoneBookFriendList.get(i).getInstallYn());
//        		long result = db.insert(tableNameAppInstallUser, null, values);
////        		if(result!=-1){
////    				Log.d(TAG,"SUCCESS");
////    			}
//        	}
//    		db.close();
//    	}catch(Exception e){
//    		isSuccess = false;
//    		e.printStackTrace();
//    	}
    	
    	// 데이터 개수가 아주 많을때  -- 테스트 결과 빠름
    	try{
    	   db.beginTransaction();
    	   // 기존 데이터는 모두 삭제.
       		String sql = "delete from " + tableNameAppInstallUser + ";";
            db.execSQL(sql);
           
    	    //insert huge data
    	    //get pre-compiled SQLiteStatement object
    	    SQLiteStatement statement = db.compileStatement("insert into " + tableNameAppInstallUser + "('phone_number', 'user_name', 'nick_name', 'install_yn') values (?,?,?,?);");
    	    for(int i=0; i<phoneBookFriendList.size(); i++){
    	    	String pn = phoneBookFriendList.get(i).getPhoneNumber();
	    		statement.bindString(1, phoneBookFriendList.get(i).getPhoneNumber());
	    		statement.bindString(2, phoneBookFriendList.get(i).getName());
	    		statement.bindString(3, phoneBookFriendList.get(i).getNickName());
	    		statement.bindString(4, phoneBookFriendList.get(i).getInstallYn());
	    		statement.execute();
    	    }
    	   db.setTransactionSuccessful();
    	}catch(Exception e){
    		e.printStackTrace();
    	}finally{
    	  db.endTransaction();
    	  db.close();
    	}
    	return isSuccess;
    }
//    
    
//  /*
//   * 테이블 조회 (테스트용) 
//   */
//  public void logCursorInfo(){
//	  
//	  Cursor c = db.query(tableNameTempAudio,null,null,null,null,null,null);
//	  
//	  
//	  Log.d(TAG,"Result:"+c.getCount()+"/Columns:"+c.getColumnCount());		// 데이터 레코드 개수 / 테이블 컬럼 개수
//	  
//	  String rowHeaders="|| ";
//	  for(int i=0; i<c.getColumnCount(); i++){
//		  rowHeaders = rowHeaders.concat(c.getColumnName(i))+" || ";
//	  }
//	  Log.d(TAG,"COLUMNS:"+rowHeaders);
//	  
//	  
//	  c.moveToFirst();
//	  String rowResults="|| ";
//	  for(int i=0; i<c.getColumnCount()-1; i++){
//		  rowResults = rowResults.concat(c.getString(i))+ " || ";
//	  }
//	  rowResults = rowResults.concat((c.getBlob(c.getColumnCount()-1).length+"")+ " || ");
//	  Log.d(TAG,"Row:"+c.getPosition()+"::"+rowResults);
//	  c.moveToNext();
//  }
  
    
    
    
    
//    // 데이터 추가 - 원본(샘플)
//    public void insertData(APinfo info) {
//        String sql = "insert into " + tableName + " values(NULL, '"
//                + info.getSSID() + "', " + info.getCapabilities() + ", '"
//                + info.getPasswd() + "');";
//        db.execSQL(sql);
//    }
// 
//    // 데이터 갱신 - 원본(샘플)
//    public void updateData(APinfo info, int index) {
//        String sql = "update " + tableName + " set SSID = '" + info.getSSID()
//                + "', capabilities = " + info.getCapabilities()
//                + ", passwd = '" + info.getPasswd() + "' where id = " + index
//                + ";";
//        db.execSQL(sql);
//    }
// 
//    // 데이터 삭제 - 원본(샘플)
//    public void removeData(int index) {
//        String sql = "delete from " + tableName + " where id = " + index + ";";
//        db.execSQL(sql);
//    }
// 
    
    
    // 데이터 검색 - db에 저장된 서버로부터 받은 앱 설치 친구 목록을 가져온다.
    public ArrayList<SendMeFriend> selectInstallUserData() {

    	String sql = "select phone_number, user_name, nick_name, install_yn from " + tableNameAppInstallUser //+ " where id = " + index
                + ";";		
        Cursor results = db.rawQuery(sql, null);
        	
	      results.moveToFirst();
	      ArrayList<SendMeFriend> phoneBookFriendList = new ArrayList<SendMeFriend>();
	
	      while (!results.isAfterLast()) {
	    	  SendMeFriend sendMeFriend = new SendMeFriend();		
	    	  sendMeFriend.setPhoneNumber(results.getString(0));
	    	  sendMeFriend.setName(results.getString(1));
	    	  sendMeFriend.setNickName(results.getString(2));
	    	  sendMeFriend.setInstallYn(results.getString(3));	
	    	  
	    	  phoneBookFriendList.add(sendMeFriend);
	          results.moveToNext();
	      }
	      results.close();
	      db.close();
	      return phoneBookFriendList;
    }
    
    
// 
//    // 데이터 전체 검색 - 원본(샘플)
//    public ArrayList<APinfo> selectAll() {
//        String sql = "select * from " + tableName + ";";
//        Cursor results = db.rawQuery(sql, null);
// 
//        results.moveToFirst();
//        ArrayList<APinfo> infos = new ArrayList<APinfo>();
// 
//        while (!results.isAfterLast()) {
//            APinfo info = new APinfo(results.getInt(0), results.getString(1),
//                    results.getInt(2), results.getString(3));
//            infos.add(info);
//            results.moveToNext();
//        }
//        results.close();
//        return infos;
//    }
}


/*
 *   액티비티에서의 호출 - 원본(샘플) 
 *   DBManager manager = new DBManager(this);
 *   manager.updateData(newInfo, index);
 *   manager.insertData(newInfo);  // 액티비티에서 이렇게 사용
 *   
 */